package com.marinesky.mstools.codec;/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG
*/

import org.apache.commons.lang.StringUtils;

//          佛曰:
//                  写字楼里写字间，写字间里程序员；    
//                  程序人员写程序，又拿程序换酒钱。    
//                  酒醒只在网上坐，酒醉还来网下眠；    
//                  酒醉酒醒日复日，网上网下年复年。    
//                  但愿老死电脑间，不愿鞠躬老板前；    
//                  奔驰宝马贵者趣，公交自行程序员。    
//                  别人笑我忒疯癫，我笑自己命太贱；    
//                  不见满街漂亮妹，哪个归得程序员？
public abstract class CodecUtil {

    private static final String HEX_STRING="0123456789ABCDEF";
    /**
     * 将byte数组转16进制字符串
     * @param src --byte数组
     * @return
     */
    public static String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            //byte 8位,int是32位,当进行运算是先进行填充,
            //java采用补码形式,最高位表示符号,0表示正,1表示负
            // 如果byte高位是0,则用0填充,如果是1,则用1填充
            //例如01000001 转化成int就变为00000000000000000000000001000001
            //如果byte的最高位是1的话，int的前面填充1例如11111111的十进制数为-1
            // 转换为int时变为11111111111111111111111111111111好多1啊，呵呵！
            // 即0xffffffff但是这个数是不对的，这种补位就会造成误差。
            // 和0xff相与后，高24比特就会被清0了，结果就对了。
           int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            //16进制4位一个字符,一个byte刚好为2字符,不足的在前面补0
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }


    /**
     * 将16进制字符串转byte数组
     * @param hexString  --16进制字符串
     * @return
     */
    public static byte[] hexStringToBytes(String hexString){
        if(StringUtils.isEmpty(hexString)){
            return null;
        }
        hexString = hexString.toUpperCase();
        int length=hexString.length()/2;
        char[] chars=hexString.toCharArray();
        byte[] b=new byte[length];
        for (int i = 0; i <length ; i++) {
            int pos = i * 2;
            b[i] = (byte) (charToByte(chars[pos]) << 4 | charToByte(chars[pos + 1]));
        }
        return b;
    }

    private static byte charToByte(char c) {
        byte b=(byte) HEX_STRING.indexOf(c);
        return b;
    }
}
